﻿#include "pch.h"
#include "GameBoard.h"

BEGIN_MESSAGE_MAP(GameBoard, CWnd)
    ON_WM_CREATE()
    ON_WM_PAINT()
    ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

/**
 * 构造方法。
 * @param width     宽度
 * @param height    高度
 */
GameBoard::GameBoard(int width, int height) :
    mForgeDrawer(NULL),
    mSize(width, height) {
}

/**
 * 获取绘图者。
 * @return 绘图者
 */
CDC* GameBoard::GetDrawer() {
    return &mBackDrawer;
}

/**
 * 创建事件的响应方法。
 * @param lpcs  事件相关信息
 * @return 创建结果
 */
int GameBoard::OnCreate(LPCREATESTRUCT lpcs) {
    int result = CWnd::OnCreate(lpcs);

    // 获取前台绘图者
    mForgeDrawer = CWnd::GetDC();

    // 创建后台缓冲位图
    mBitmap.CreateCompatibleBitmap(mForgeDrawer, mSize.cx, mSize.cy);

    // 创建后台绘图者
    mBackDrawer.CreateCompatibleDC(mForgeDrawer);

    // 将后台缓冲位图与后台绘图者关联
    mBackDrawer.SelectObject(&mBitmap);

    return result;
}

/**
 * 鼠标右键抬起事件的响应方法。
 * @param flags 事件相关信息
 * @param point 鼠标右键抬起时鼠标所在的位置
 */
void GameBoard::OnLButtonUp(UINT flags, CPoint point) {
    LPARAM lParam = MAKELPARAM(point.x, point.y);
    CWnd::GetParent()->SendMessage(WM_LBUTTONUP, flags, lParam);
    CWnd::OnLButtonUp(flags, point);
}

/**
 * 重绘事件的响应方法。
 */
void GameBoard::OnPaint() {
    CWnd::OnPaint();
    mForgeDrawer->BitBlt(0, 0, mSize.cx, mSize.cy, &mBackDrawer, 0, 0, SRCCOPY);
}
